/******************************************************************************
 * QwtPolar Widget Library
 * Copyright (C) 2008   Uwe Rathmann
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the Qwt License, Version 1.0
 *****************************************************************************/

#include "qwt_polar_panner.h"
#include "qwt_point_polar.h"
#include "qwt_scale_div.h"

//! Create a plot panner for a polar plot canvas
QwtPolarPanner::QwtPolarPanner(QwtPolarCanvas *canvas) : QwtPanner(canvas) {
  connect(this, SIGNAL(panned(int, int)), SLOT(movePlot(int, int)));
}

//! Destructor
QwtPolarPanner::~QwtPolarPanner() {}

//! \return observed plot canvas
QwtPolarCanvas *QwtPolarPanner::canvas() {
  return qobject_cast<QwtPolarCanvas *>(parent());
}

//! \return observed plot canvas
const QwtPolarCanvas *QwtPolarPanner::canvas() const {
  return qobject_cast<const QwtPolarCanvas *>(parent());
}

//! \return observed plot
QwtPolarPlot *QwtPolarPanner::plot() {
  QwtPolarCanvas *c = canvas();
  if (c)
    return c->plot();

  return nullptr;
}

//! \return observed plot
const QwtPolarPlot *QwtPolarPanner::plot() const {
  const QwtPolarCanvas *c = canvas();
  if (c)
    return c->plot();

  return nullptr;
}

/*!
   Adjust the zoomed area according to dx/dy

   \param dx Pixel offset in x direction
   \param dy Pixel offset in y direction

   \sa QwtPanner::panned(), QwtPolarPlot::zoom()
 */
void QwtPolarPanner::movePlot(int dx, int dy) {
  QwtPolarPlot *plot = QwtPolarPanner::plot();
  if (plot == nullptr || (dx == 0 && dy == 0))
    return;

  const QwtScaleMap map = plot->scaleMap(QwtPolar::Radius);

  QwtPointPolar pos = plot->zoomPos();
  if (map.s1() <= map.s2()) {
    pos.setRadius(map.transform(map.s1() + pos.radius()) - map.p1());
    pos.setPoint(pos.toPoint() - QPointF(dx, -dy));
    pos.setRadius(map.invTransform(map.p1() + pos.radius()) - map.s1());
  } else {
    pos.setRadius(map.transform(map.s1() - pos.radius()) - map.p1());
    pos.setPoint(pos.toPoint() - QPointF(dx, -dy));
    pos.setRadius(map.s1() - map.invTransform(map.p1() + pos.radius()));
  }

  const bool doAutoReplot = plot->autoReplot();
  plot->setAutoReplot(false);

  plot->zoom(pos, plot->zoomFactor());

  plot->setAutoReplot(doAutoReplot);
  plot->replot();
}

/*!
   Block panning when the plot zoom factor is >= 1.0.

   \param event Mouse event
 */
void QwtPolarPanner::widgetMousePressEvent(QMouseEvent *event) {
  const QwtPolarPlot *plot = QwtPolarPanner::plot();
  if (plot) {
    if (plot->zoomFactor() < 1.0)
      QwtPanner::widgetMousePressEvent(event);
  }
}
